//
//  ViewController.m
//  异步下载网络图片
//
//  Created by 伍银荣 on 2021/8/31.
//  Copyright © 2021 com.WYR. All rights reserved.
//

#import "ViewController.h"
#import "WYRAppInfo.h"

@interface ViewController ()
@property (nonatomic, strong) NSArray *dataArr;
@property (nonatomic, strong) NSOperationQueue *queue;
//图片缓存池
@property (nonatomic, strong) NSMutableDictionary *imageCache;

@end

//1.创建模型,获取数据,测试
//2.实现数据源方法
//3.同步下载网络图片 -----> 网速比较慢,界面会卡顿
//4.异步下载网络图片 -----> 图片显示不出来,点击cell或者上下拖动图片可以显示图片
//   解决: 使用占位图片
//5.图片缓存----把网络下载的图片保存到内存
//   解决:图片重复下载,把图片缓存到内存中,节约用户的流量(拿空间换取时间)
//6.解决图片下载速度特别慢,出现的错行问题
//   解决:当图片下载完成后,重新 加载对应的cell
//7.当收到内存警告,要清理内存,如果图片存储在模型对象中,不好清理内存
//  解决:重新创建一个缓存池,废弃掉之前在模型对象中的image缓存对象


@implementation ViewController

-(NSArray *)dataArr {
    if (!_dataArr) {
        //获取模型数据
        _dataArr = [WYRAppInfo appInfos];
    }
    return _dataArr;
}

-(NSOperationQueue *)queue {
    if (!_queue) {
        _queue = [[NSOperationQueue alloc]init];
    }
    return _queue;
}

-(NSMutableDictionary *)imageCache {
    if (!_imageCache) {
        _imageCache = [NSMutableDictionary dictionaryWithCapacity:10];
    }
    return _imageCache;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.tableView.rowHeight = 80;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.dataArr.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellId = @"appInfo_cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellId];
    }
    //获取数据,给cell内部控件赋值
    WYRAppInfo *appInfo = self.dataArr[indexPath.row];
    //cell的创建也是懒加载形式. 当返回cell之前,会调用cell的layoutSubViews方法
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    cell.textLabel.text = appInfo.name;
    cell.detailTextLabel.text = appInfo.download;
    //判断缓存中是否有图片
    if (self.imageCache[appInfo.icon]) {
        NSLog(@"正在缓存图片");
        //设置缓存的图片
        cell.imageView.image = self.imageCache[appInfo.icon];
        //如果缓存中有图片,就不执行下面的操作了
        return cell;
    }
    //给定一张默认图片
    cell.imageView.image = [UIImage imageNamed:@"default"];
    //异步下载图片
    //模拟网速有点慢
    [self.queue addOperationWithBlock:^{
        if (indexPath.row > 8) {
            [NSThread sleepForTimeInterval:10];  //模拟后面几行cell下载速度很慢很慢
            //此时会发现图片显示的不对,发生了错行显示
        }
        
        NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:appInfo.icon]];
        UIImage *img = [UIImage imageWithData:data];
        NSLog(@"正在下载图片");
        
        //图片下载完成后,缓存图片
        self.imageCache[appInfo.icon] = img;
        //在主线程上更新UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
           // cell.imageView.image = img;
            
            //图片下载完成后,刷新对应的cell
            [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
            //使用sizeToFit图片可以显示出来了,但是显示的位置不对
           // [cell.imageView sizeToFit];
        }];
    }];
    
    return cell;
}

//接收到内存警告,清空内存
-(void)didReceiveMemoryWarning {
    [self.imageCache removeAllObjects];
}


@end
